#include "casolist.h"

CasoList::CasoList(CasoList *next, vector<TipoDato *> tipodato, Sentencia *instrucciones)
{
    this->next=next;
    this->tipodato = tipodato;
    this->instrucciones = instrucciones;
}

void CasoList::setNext(CasoList *next)
{
    this->next=next;
}

void CasoList::setTipodato(vector<TipoDato *> tipodato)
{
    this->tipodato=tipodato;
}

void CasoList::setInstrucciones(Sentencia *instrucciones)
{
    this->instrucciones=instrucciones;
}

CasoList *CasoList::getNext()
{
    return this->next;
}

vector<TipoDato *> CasoList::getTipodato()
{
    return this->tipodato;
}

Sentencia *CasoList::getInstrucciones()
{
    return this->instrucciones;
}

void CasoList::setVariable(Tipo_ts *variable)
{
    this->variable=variable;
}

Tipo_ts *CasoList::getVariable()
{
    return this->variable;
}

Tipo_ts *CasoList::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    for(int i=0;i<(int)this->tipodato.size();i++){
        Tipo_ts *tts = this->tipodato.at(i)->validarSemantica(tabla_de_tipo,tabla_de_varaible);
        if(tts != this->getVariable()){
            stringstream out;
            out<<"EL tipo de dato del label es incorrecto"<<endl;
            throw exception(out.str().c_str());
        }
    }
    if(this->instrucciones!=0){
        this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    if(this->getNext()!=0){
        this->getNext()->setVariable(this->getVariable());
        this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    return 0;
}

string CasoList::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    string codigo = "case ";
    for(int i = 0 ; i< this->getTipodato().size();i++){
        codigo += this->getTipodato().at(i)->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo+",";
    }
    codigo = codigo.substr(0,codigo.size()-1);
    codigo += ":\n";
    if(this->getInstrucciones()!=0){
    codigo += this->getInstrucciones()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }
    codigo += "break;\n";
    if(this->getNext()!=0){
        codigo += this->getNext()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }

    return codigo;
}
